home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / lang / c-part1 / 288 < prev    next >
Encoding:
Text File  |  1996-08-05  |  3.2 KB  |  146 lines

  1. Path: gramercy.ios.com!lalit
  2. From: lalit@gramercy.ios.com (lalit gidwani)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: Unix Domain Socket problem...
  5. Date: 4 Jan 1996 02:17:09 GMT
  6. Organization: Internet Online Services
  7. Distribution: Zollen
  8. Message-ID: <4cfdb5$keo@news2.ios.com>
  9. References: <DKEstL.JBB@ariel.cs.yorku.ca>
  10. NNTP-Posting-Host: gramercy.ios.com
  11. X-Newsreader: TIN [version 1.2 PL2]
  12.  
  13. STEPHEN HOI CHI KONG (cs911319@ariel.cs.yorku.ca) wrote:
  14. : /*
  15. :  * Unix Domain Socket
  16. :  * 
  17. :  *     Child process passes a file descriptor to its parent by using
  18. :  *     Unix domain socket.
  19. :  * 
  20. :  *     Function 'my_open' fork a child process. The child process
  21. :  *     then open a file and return a file descriptor and send the
  22. :  *     fd back to parent using 'sendmsg', parent receive the fd by
  23. :  *     using 'recvmsg'.
  24. :  * 
  25. :  *     I am learing this socket but for no reason, it core dumped on
  26. :  *     my solaris II system.
  27. :  * 
  28. :  *     Could any expert out there pinpoint any bugs so that I can 
  29. :  *     relieve my headache please....
  30. :  */
  31.  
  32. : #include <sys/types.h>
  33. : #include <sys/socket.h>
  34. : #include <sys/uio.h>
  35.  
  36.  
  37. : #define    BUFFER_SIZE    4096
  38.  
  39.  
  40. : int my_open (char *name, int mode);
  41. : int s_pipe (int sfd[]);
  42. : int send_sock (int sockfd, int fd);
  43. : int recv_sock (int sockfd);
  44.  
  45.  
  46.  
  47. : main(int argc, char **argv)
  48. : {
  49. :      int     n, fd;
  50. :      char     buff[BUFFER_SIZE];
  51. :      
  52. :      if (argc != 2)  {
  53. :       printf ("Usage: %s [filename]\n", argv[0]);
  54. :       exit(1);
  55. :      }
  56. :      
  57. :      if ((fd = my_open (argv[1], 0)) < 0)  {
  58. :       printf ("Error opening file.\n");
  59. :       exit (1);
  60. :      }
  61. :      
  62. :      while ((n = read (fd, buff, BUFFER_SIZE)) > 0)
  63. :              if (write (1, buff, n) != n)
  64. :                  printf ("Write error!\n");
  65. : }
  66.  
  67.  
  68. : int my_open (char *name, int mode)
  69. : {
  70. :      int     desc[2], fd;
  71. :      
  72. :      if (s_pipe (desc) < 0)
  73. :            return -1;
  74. :      
  75. :      if (fork() != 0)   {    /* parent process */
  76. :       
  77. :       close (desc[1]);
  78. :       
  79. :       fd = recv_sock (desc[0]);
  80. :       
  81. :       wait();
  82. :       close (desc[0]);
  83. :       
  84. :       return fd;
  85. :      }
  86. :      else  {    /* must be child */
  87. :       
  88. :       close (desc[0]);
  89. :       
  90. :       fd = open (name, mode);
  91. :       send_sock (desc[1], fd);
  92. :       
  93. :       close (desc[1]);
  94. :       
  95. :       exit (0);
  96. :      }
  97. : }
  98. :       
  99. : int s_pipe (int sfd[])
  100. : {
  101. :      return socketpair (AF_UNIX, SOCK_STREAM, 0, sfd);
  102. : }
  103.  
  104. : int send_sock (int sockfd, int fd)
  105. : {
  106. :      struct iovec    iov[1];
  107. :      struct msghdr    msg;
  108. :      extern int        errno;
  109. :      
  110. :      
  111. :      iov[0].iov_base = (char *) 0;    /* no data to send */
  112. :      iov[0].iov_len = 0;
  113. :      
  114. :      msg.msg_iov        = iov;
  115. :      msg.msg_iovlen        = 1;
  116. :      msg.msg_name        = (caddr_t) 0;
  117. :      msg.msg_accrights        = (caddr_t) &fd;
  118. :      msg.msg_accrightslen    = sizeof(fd);
  119. :      
  120. :      if (sendmsg (sockfd, &msg, 0) < 0)
  121. :             return ((errno > 0) ? errno : 255);
  122. :      
  123. :      return 0;
  124. : }
  125.  
  126. : int recv_sock (int sockfd)
  127. : {
  128. :      int        fd;
  129. :      struct iovec    iov[1];
  130. :      struct msghdr    msg;
  131. :      
  132. :      iov[0].iov_base        = (char *) 0;
  133. :      iov[0].iov_len        = 0;
  134. :      
  135. :      msg.msg_iov        = iov;
  136. :      msg.msg_iovlen        = 1;
  137. :      msg.msg_name        = (caddr_t) 0;
  138. :      msg.msg_accrights        = (caddr_t) &fd;
  139. :      msg.msg_accrightslen    = sizeof (fd);
  140. :      
  141. :      if (recvmsg (sockfd, &msg, 0) < 0)
  142. :            return -1;
  143. :      
  144. :      return fd;
  145. : }
  146.